package day3;

/**
 * javaproject.
 * Create by Devin on 2021/6/11.
 * <p>
 * Copyright (c) 2021-present, Devin.
 * All rights reserved.
 */
public class Main {
    public static void main(String[] args) {
        // 这种尽量引用高层类型，避免引用实际子类型的方式，
        // 称之为面向抽象编程(面向协议编程)
        // 1.上层代码只定义规范；
        // 2.不需要子类就可以实现业务逻辑；
        // 3.具体的业务逻辑由不同的子类实现，调用者并不关心。
        Person s = new Student();
        s.run();
    }
}

// 抽象类无法实例化 p = new Person(); // 错误
abstract class Person {
    protected int age;
    public abstract void run();
}

// 因为抽象类本身被设计成只能用于被继承，
// 因此，抽象类可以强迫子类实现其定义的抽象方法，否则编译会报错。
// 因此，抽象方法实际上相当于定义了“规范”
class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student run");
    }
}

// 如果一个抽象类没有字段，所有方法全部都是抽象方法：
// 就可以把该抽象类改写为接口：interface。
interface Animal {
    void run();
}